package org.ace.logic.map;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import io.netty.channel.Channel;

import org.ace.Manager.interfaces.IHandlerManager;
import org.ace.constans.GameConstans;
import org.ace.endingCode.SocketModel;
import org.ace.logic.IHandlerServ;
import org.ace.logic.IoHandler;
import org.ace.logic.map.protocol.MapProtocol;

public abstract class MapHandler implements IoHandler {
  
	private IHandlerManager manager;

	
	public abstract IHandlerServ createMapHandler();
	/*一个channel 一个角色 一个当前地图模块所绑定的地图，用以存储用户 ，地图id 都是通过Channel 操作*/
	private Map<Channel,Integer> userMap=new ConcurrentHashMap<Channel, Integer>();
	
	@PostConstruct
	public void init()
	{
		/* 注册所有 地图,id 就是二级区域area 区分不同的地图模块 */
		for(int id: GameConstans.MAP_LIST)
		{
			manager.register(id, createMapHandler());
		}
	}
	
	@Override
	public void messageReceived(Channel channel, SocketModel message) {
		/*越权判断 当前为3级协议中的进入地图协议，如果当前角色在某一场景的时候 将其移除当前
		 * 场景,并添加场景 否者直接添加到新场景*/
		if(message.getCommand()==MapProtocol.ENTER_CREQ)
		{
			if(userMap.containsKey(channel))
			{/*已经在的话，删除当前在场景中的角色，然后再添加*/
				manager.get(userMap.get(channel)).Colse(channel);
			}
			/*没进一次都是将角色先移除在存入(如果有的话)*/
			userMap.put(channel,message.getArea());
			manager.get(message.getArea()).messageReceived(channel, message);
		}
	}

	@Override
	public void channelClose(Channel channel) {
		if(userMap.containsKey(channel))
		{/*socket断开的话 移除该角色在绑定地图中的信息 */
			int userArea=userMap.get(channel);
			manager.get(userArea).Colse(channel);
		}

	}

	
	/*管理器*/
	@Resource(name="mapManager")
	protected void setManager(IHandlerManager manager)
	{
		this.manager = manager;
	}
	
	@Override
	public void onShake(Channel channel) {
		// TODO Auto-generated method stub

	}

}
